home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / c / cug173.zip / CLEX.LXI < prev    next >
Text File  |  1980-01-01  |  5KB  |  143 lines

  1.  
  2. /*
  3.  * C lex
  4.  */
  5. %{
  6. extern  char    *install();
  7. %}
  8. digit   = [0-9];
  9. letter  = [a-zA-Z_$];
  10. name    = letter (letter|digit)*;
  11. integer = digit digit*;
  12. %{
  13. main()
  14. {
  15.         register int    i;
  16.         char            buffer[80];
  17.         extern char     *token();
  18.  
  19.         while (i = yylex()) {
  20.                 gettoken(buffer, sizeof buffer);
  21.                 printf("yylex returns %d, token = \"%s\"\n",
  22.                         i, buffer);
  23.                 if (i == LEXERR) {
  24.                         error("LEXERR -- abort");
  25.                         break;
  26.                 }
  27.         }
  28. }
  29. %}
  30. %%
  31. %{
  32.         register int    c;
  33. %}
  34. #DEFINE         { return(__na__); }
  35. #ELSE           { return(__na__); }
  36. #ENDIF          { return(__na__); }
  37. #IFDEF          { return(__na__); }
  38. #INCLUDE        { return(__na__); }
  39. STRUCT          { return(-1); }
  40. AUTO            { return(__na__); }
  41. EXTERN          { return(__na__); }
  42. STATIC          { return(__na__); }
  43. REGISTER        { return(__na__); }
  44. GOTO            { return(__na__); }
  45. RETURN          { return(__na__); }
  46. IF              { return(__na__); }
  47. WHILE           { return(__na__); }
  48. ELSE            { return(__na__); }
  49. SWITCH          { return(__na__); }
  50. CASE            { return(__na__); }
  51. BREAK           { return(__na__); }
  52. CONTINUE        { return(__na__); }
  53. DO              { return(__na__); }
  54. DEFAULT         { return(__na__); }
  55. FOR             { return(__na__); }
  56. SIZEOF          { return(__na__); }
  57. TYPEDEF         { return(__na__); }
  58. UNION           { return(__na__); }
  59. name            {
  60.                         lexval = install();
  61.                         return(6);
  62.                 }
  63. integer         {
  64.  
  65.                         lexval = install();
  66.                         return(7);
  67.                 }
  68. "<"             { return(__na__); }
  69. "<="            { return(__na__); }
  70. "="             { return(__na__); }
  71. "!="            { return(__na__); }
  72. ">="            { return(__na__); }
  73. ">"             { return(__na__); }
  74. "<<"            { return(__na__); }
  75. ">>"            { return(__na__); }
  76. "=+"            { return(__na__); }
  77. "=-"            { return(__na__); }
  78. "=/"            { return(__na__); }
  79. "=%"            { return(__na__); }
  80. "%"             { return(__na__); }
  81. "/"             { return(__na__); }
  82. "*"             { return(__na__); }
  83. "=*"            { return(__na__); }
  84. "=<<"           { return(__na__); }
  85. "=>>"           { return(__na__); }
  86. "&"             { return(__na__); }
  87. "|"             { return(__na__); }
  88. "=|"            { return(__na__); }
  89. "=&"            { return(__na__); }
  90. "+"             { return(__na__); }
  91. "-"             { return(__na__); }
  92. "++"            { return(__na__); }
  93. "--"            { return(__na__); }
  94. ";"             { return(__na__); }
  95. "?"             { return(__na__); }
  96. "."             { return(__na__); }
  97. ","             { return(__na__); }
  98. "/*"            {
  99.                         comment("*/");
  100.                         return(LEXSKIP);
  101.                 }
  102. "'"             {
  103.                         if ((c = mapch('\'', '\\')) != -1)
  104.                                 while (mapch('\'', '\\') != -1)
  105.                                         lexerror("Long character constant");
  106.                         printf("%c", c);
  107.                         return(__na__);
  108.                 }
  109. "\""            { return(__na__); }     /* This should call "lexswitch" */
  110. "\n"            { return(__na__); }
  111. " "             { return(__na__); }
  112. "\t"            { return(__na__); }
  113. "||"            { return(__na__); }
  114. "&&"            { return(__na__); }
  115. "("             { return(__na__); }
  116. ")"             { return(__na__); }
  117. "["             { return(__na__); }
  118. "]"             { return(__na__); }
  119. "{"             { return(__na__); }
  120. "}"             { return(__na__); }
  121. %%
  122. char *
  123. install()
  124. /*
  125.  * Install the current token in the symbol table
  126.  */
  127.  
  128. {
  129.         register char   *buffer;        /* Where to put the character   */
  130.         register char   *first;         /* -> first byte of the token   */
  131.         char            *last;          /* Can't be in a register       */
  132.         extern char     *token();
  133.  
  134.         first = token(&last);           /* Find first/last of token     */
  135.         if ((buffer = alloc((last - first) + 1)) == NULL) {
  136.                 error("Out of space in install");
  137.                 exit(1);                
  138.         }
  139.         first = copy(buffer, first, (last - first));
  140.         *first = '\0';
  141.         return(buffer);
  142. }
  143.